/**
 * 备忘录模式
 */
//  在不破坏封装的条件下，通过备忘录对象存储另外一个对象内部状态的快照，在将来合适的时候把这个对象还原到存储起来的状态。
class Player1 {
    // 生命值
    private life = 100;
    // 魔法值
    private magic = 100;
    fightBoss() {
        this.life -= 100;
        this.magic -= 100;
        if (this.life <= 0) {
            console.log('壮烈牺牲');
        }
    }
    getLife() {
        return this.life;
    }
    setLife(life: number) {
        this.life = life;
    }
    getMagic() {
        return this.magic;
    }

    setMagic(magic: number) {
        this.magic = magic;
    }
    // 存档
    saveState() {
        return new Memento(this.life, this.magic);
    }
    // 读档
    restoreState(memento: Memento) {
        this.life = memento.life;
        this.magic = memento.magic;
    }
}
// 新建备忘录类
class Memento {
    life: number;
    magic: number;
    constructor(life: number, magic: number) {
        this.life = life;
        this.magic = magic;
    }
}

const player = new Player1();
// // 存档
// const savedLife = player.getLife();
// const savedMagic = player.getMagic();
// 存档
const memento = player.saveState();

// 打 Boss，打不过，壮烈牺牲
player.fightBoss();

// // 读档，恢复到打 Boss 之前的状态
// player.setLife(savedLife);
// player.setMagic(savedMagic);
// 读档
player.restoreState(memento);

// 备忘录模式的优点是：

// 给用户提供了一种可以恢复状态的机制，可以使用户能够比较方便的回到某个历史的状态
// 实现了信息的封装，使得用户不需要关心状态的保存细节
// 缺点是：

// 消耗资源，如果类的成员变量过多，势必会占用比较大的资源，而且每一次保存都会消耗一定的内存。
// 总体而言，备忘录模式是利大于弊的，所以许多程序都为用户提供了备份方案。比如 IDE 中，用户可以将自己的设置导出成 zip，当需要恢复设置时，再将导出的 zip 文件导入即可。这个功能内部的原理就是备忘录模式。
